package codec

import "io"

type Header struct {
	// 服务名和方法名，通常与Go语言中的结构体和方法相映射
	ServiceMethod string
	// 请求序列号，也可以认为是某个请求的ID，用来区分不同的请求
	Seq				uint64
	// 错误信息，客户端置为空，服务端若发生错误，将错误信息置于Error中
	Error        string
}

type Codec interface {
	io.Closer
	ReadHeader(header *Header) error
	ReadBody(interface{}) error
	Write(*Header, interface{}) error
}

type NewCodeFunc func(io.ReadWriteCloser) Codec

type Type string

const (
	GobType Type  = "application/gob"
	JsonType Type = "application/json"		// not implemented
)

var NewCodecFuncMap map[Type]NewCodeFunc

func init() {
	NewCodecFuncMap = make(map[Type]NewCodeFunc)
	NewCodecFuncMap[GobType] = NewGobCodec
}